﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
/****************六，函数******************/
/**********2. 库函数********/
//int main()
//{
//	double r = sqrt(16.0);
//	printf("%lf\n",r);
//	printf("%.1lf\n", r);
//	return 0;
//}


/*********3. ⾃定义函数*******/

//ret_type fun_name(形式参数) //ret_type是函数返回类型
//{							// fun_name是函数名
//							//括号中放的是形式参数
//							//{}括起来的是函数体
//}

//3.2 函数的举例
//写⼀个加法函数，完成2个整型变量的加法操作

//int main()
//{
//	int a = 0;
//	int b = 0;
//	//输入
//	scanf("%d %d",&a,&b);
//	//计算
//	int c = a + b;
//	//输出
//	printf("%d",c);
//
//	return 0;
//}

//函数定义
//int Add(int x, int y)
//{
//	int z = x + y;
//	return z;//返回计算的和
//}

//int Add(int x, int y)
//{
//	return x + y;
//}
//int main()
//{
//	int a = 0;
//	int b = 0;
//	//输入
//	scanf("%d %d", &a, &b);
//	//计算
//	int c =Add(a, b);//调用Add函数，完成a和b的相加
//	//输出
//	printf("%d", c);
//	return 0;
//}


/***********4. 形参和实参************/

//当函数调用的时候实参传递给形参的时候形参会创建自己的空间来存放实参的值
//形参和实参不是同一块空间，对形参的修改不会影响实参
//可以理解为：形参是实参的一份临时拷贝


/**********5. return 语句*********/

//1.return后边可以是⼀个数值，也可以是⼀个表达式，如果是表达式则先执⾏表达式，再返回表达式的结果

//2.return后边也可以什么都没有，直接写return;这种写法适合函数返回类型是void的情况

//void test()
//{
//	printf("hehe\n");
//	int a = 0;
//	scanf("%d",&a);
//	if (a == -1)
//		return;//return 就是返回的意思
//	printf("haha\n");
//
//}
//int main()
//{
//	test();
//	return 0;
//}

//3.return语句执⾏后，函数就彻底返回，后边的代码不再执⾏

//4.return返回的值和函数返回类型不⼀致，系统会⾃动将返回的值隐式转换为函数的返回类型
//int test()
//{
//	printf("haha\n");
//	int a = 0;
//	scanf("%d",&a);
//	if (a == 1)
//		return 3.14;
//	else
//		return -3.14;
//}
//
//int main()
//{
//	int r = test();
//	printf("%d\n",r);
//	return 0;
//}

//5.如果函数中存在if等分⽀的语句，则要保证每种情况下都有return返回，否则会出现编译错误
//int test()
//{
//	printf("haha\n");
//	int a = 0;
//	scanf("%d",&a);
//	if (a == 1)
//		return 5;
//	else
//		return -5;
//}
//
//int main()
//{
//	int r = test();
//	printf("%d\n",r);
//	return 0;
//}

//6.函数的返回类型如果不写，编译器会默认函数的返回类型是int
//编译器会认为这个函数返回类型是int
//test()
//{
//	printf("haha\n");
//	int a = 0;
//	scanf("%d", &a);
//	printf("hello world");
//	//最终实际返回值不知道
//}
//
//int main()
//{
//	int r = test();
//	printf("%d\n", r);
//	return 0;
//}

//7.函数写了返回类型，但是函数中没有使⽤return返回值，那么函数的返回值是未知的
//int test()
//{
//	printf("haha\n");
//	int a = 0;
//	scanf("%d", &a);
//	printf("hello world");
//	//最终实际返回值不知道
//}
// 
//int main()
//{
//	int r = test();
//	printf("%d\n", r);
//	return 0;
//}


/********6. 数组做函数参数******/
//写⼀个函数将⼀个整型数组的内容，全部置为-1，再写⼀个函数打印数组的内容

//实参和形参可以同名
//void set_arr(int arr1[],int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		arr1[i] = -1;
//	}
//}
//
//void print_arr(int arr1[],int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ",arr1[i]);
//	}
//	printf("\n");
//}
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	print_arr(arr, sz);
//
//	//写一个函数，将数组arr的内容全部置为-1
//	set_arr(arr,sz);//数组传参其实传的是数组首元素地址(指针)
//					//数组的形参会影响实参
//					//形参操作的数组和实参的数组是同⼀个数组
//					// 
//	//写一个函数，打印数组内容
//	print_arr(arr, sz);
//	return 0;
//}

/*********7. 嵌套调⽤和链式访问************/

/******7.1 嵌套调⽤******/
//假设我们计算某年某⽉有多少天？
// 
//is_leap_year()：根据年份确定是否是闰年
//get_days_of_month()：调⽤is_leap_year确定是否是闰年后，再根据⽉计算这个⽉的天数

//   29
//31,28,31,30,31,30,31,31,30,31,30,31
//1  2  3  4  5  6  7  8  9  10 11 12

//是闰年返回1
//不是闰年返回0
is_leap_year(int y)
{
	if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
		return 1;
	else
		return 0;
}
int get_days_of_month(int y, int m)
{
	int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
					//1  2  3  4  5  6  7  8  9  10 11 12
	int d = days[m];

	//判断是否为闰年
	if (is_leap_year(y) && m == 2)
		d += 1;
	return d;
}

int main()
{
	int year = 0;
	int month = 0;
	scanf("%d %d",&year,&month);
	
	//计算year年month月的天数 2024年 10月有多少天？
	int d = get_days_of_month(year,month);
	printf("%d\n",d);
	return 0;
}





